package com.example.zz.example.datastructures.collection;

import java.util.HashMap;

/**
 * @author: zhuozhang6
 * @date: 2021/11/2
 * @email: zhuozhang6@iflytek.com
 * @Description:
 *
 * https://baijiahao.baidu.com/s?id=1712744857260389238&wfr=spider&for=pc
 *
 * Map是键值对的集合，是带有特定标识的数据的集合存储方式。常用的Map实现类
 * 散列表(拉链法)：即数组+链表，通过对象计算出hash值，作为角标存储到数组，如果hash值的数组位置没有值就直接放入，如果已经有相同hash值的已经存在，就在已存在后面链表添加
 * HashMap：1.7散列表(拉链法)、1.8散列表(拉链法)+红黑树，无序，线程不安全；默认容量是16，扩充因子是0.75，达到容量的0.75后会扩容一倍；
 * TreeMap：红黑树，有序(自动排序)，线程不安全
 * HashTable：散列表(拉链法)，无序，线程安全
 * LinkedHashMap：双向链表+散列表(拉链法)，有序(插入顺)，线程不安全
 * ConcurrentHashMap：无序？，线程安全
 *
 * HashMap：简单来说，HashMap由数组+链表组成的，数组是HashMap的主体，链表则是主要为了解决哈希冲突而存在的，
 * 如果定位到的数组位置不含链表（当前entry的next指向null）,那么对于查找，添加等操作很快，仅需一次寻址即可；
 * 如果定位到的数组包含链表，对于添加操作，其时间复杂度为O(n)，首先遍历链表，存在即覆盖，否则新增；对于查找操作来讲，
 * 仍需遍历链表，然后通过key对象的equals方法逐一比对查找。所以，性能考虑，HashMap中的链表出现越少，性能才会越好。
 *
 */
public class MapTest {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();

        String a = "ab";
        int hash = hash(a);
        System.out.println(hash);
        //3105  字符串计算hash的方式，每个字母乘以31并累加

        Student student = new Student();
        int hash1 = hash(student);
        System.out.println(hash1);
        //666982193

        int b = 9;
        int hash2 = hash(b);
        System.out.println(hash2);
        //9
    }

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

    private static class Student {
    }
}
